package route

import (
	"bufio"
	"fmt"
	"net/http"
	"os/exec"

	"gitee.com/liumou_site/logger"
	"github.com/gin-gonic/gin"
)

// TcpTracerouteHandler 处理TCP路由跟踪请求。
// 该函数从HTTP请求中获取目标地址和端口，验证目标地址的有效性，并执行tcptraceroute命令。
// 最后将命令的输出作为HTTP响应返回。
//
// 参数:
//   - c *gin.Context: Gin框架的上下文对象，用于处理HTTP请求和响应。
//
// 返回值:
//
//	无返回值，但通过c.String返回HTTP响应。
func TcpTracerouteHandler(c *gin.Context) {
	// 从请求中获取目标地址和端口，如果未提供则使用默认值
	dest := c.DefaultQuery("dest", "8.8.8.8")
	port := c.DefaultQuery("port", "80")

	// 验证目标地址的有效性
	validatedDest, err := ValidateAddress(dest)
	if err != nil {
		c.String(http.StatusBadRequest, err.Error())
		return
	}
	logger.Debug("dest:", validatedDest)
	logger.Debug("port:", port)

	// 设置响应头为流式输出
	c.Header("Content-Type", "text/event-stream")
	c.Header("Cache-Control", "no-cache")
	c.Header("Connection", "keep-alive")

	// 创建tcptraceroute命令
	cmd := exec.Command("tcptraceroute", validatedDest, port)
	stdout, err := cmd.StdoutPipe()
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}
	if err := cmd.Start(); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}
	// 实时读取输出并发送到客户端
	scanner := bufio.NewScanner(stdout)
	for scanner.Scan() {
		line := scanner.Text()
		fmt.Fprintf(c.Writer, "data: %s\n\n", line)
		c.Writer.Flush()
	}
	if err := cmd.Wait(); err != nil {
		fmt.Fprintf(c.Writer, "data: Error: %s\n\n", err.Error())
		c.Writer.Flush()
	}
}
